package com.gitee.chili.leisure.util;

import com.gitee.chili.leisure.util.functional.Function;

import java.util.ArrayList;
import java.util.List;

/**
 * AssistMahjong
 *
 * @author week solider
 * @since 2020.09.17
 */
public class AssistMahjong {

    /**
     *
     * 按照数字顺序进行 每次对同一个类型添加花色数量的牌
     * 容易理解的方式 伪代码这个方法的内容相当于下列代码
     * 添加一次花色的过程如下，如果只需要3种花色类型，将下列代码循环3次得到：
     *    <pre>
     *       int count = 不同牌的数量 (比如麻将，不计算风的情况下，有 1~9 种不同类型的牌)
     *       // 注意: 这里的下标是从1开始
     *       for(i = 1; i < 10; i++){
     *           int size = 每张牌的张数，麻将基础规则每张牌的张数是固定的
     *           for(j = 0; j < 4; j++){
     *           // 这里一定是 i ,里层只是花色类型, 这里并没有对花色类型做记录 但是显而易见
     *           // 它们是有规律的 这里提前规定了 1~9 代表万、11~19 代表条、21~29 代表筒
     *           // 每一张牌都有四张，所以循环四次
     *               cads.add(i)
     *           }
     *       }
     *    </pre>
     *
     * @param start     开始位置
     * @param end       结束位置
     * @param cards     初始化
     * @param cardNum   牌的总张数
     * @param singleNum 每张牌的数量
     */
    public static List<Integer> generateCards(int start, int end, List<Integer> cards, int cardNum, int singleNum) {
        Function.foreach(start, end, i -> Function.foreach(singleNum, j -> cards.add(i)));

        // 牌的张数不够时 进行递归
        return cards.size() < cardNum ? generateCards(end + 1, end + 10, cards, cardNum, singleNum) : cards;
    }

    /**
     * 四川麻将
     * {@link #generateCards(int, int, List, int, int)}
     */
    public static List<Integer> generateCards() {
        return generateCards(1, 10, new ArrayList<>(108), 108, 4);
    }

    public static void main(String[] args) {
        System.out.println(generateCards());
        System.out.println(generateCards().size());
    }
}
